# -*- coding: utf-8 -*-
# @Time    : 2021/2/23 21:35
# @Author  : FangQianqian
# @File    : testBs4.py
# @Software: PyCharm

"""
Beautiful Soup将复杂H TML文档转换成一个复杂的树形结构,每个节点都是Python对象,所有对象可以归纳为4种: Tag , NavigableString , BeautifulSoup, Comment .
-Tag
-NavigableString
-BeautifulSoup
-Comment
"""



from bs4 import BeautifulSoup
import re

file = open('./baidu.html','rb')   #以二进制读取打开的文件，当前文件夹下./
html = file.read()    #读取文件
bs = BeautifulSoup(html,'html.parser')   #用html.parser解析器解析文件html，使html文件以树形结构存在内存中

#1 -Tag ,标签及其内容，拿到它找到的第一个内容
# print(bs.title)   #网页的title
# print(type(bs.title))  #网页的title
# print(bs.a)
# print(type(bs.a))
# # print(bs.head)
# print(type(bs.head))
# # print(bs.html)
# print(type(bs.html))
# # print(bs.div)
# print(type(bs.div))
# # print(bs.body)
# print(type(bs.body))


#拿到标签里的所有属性，以键值对的方式
# print(bs.a.attrs)
# print(bs.meta.attrs)
# print(bs.div.attrs)

#2 -NavigableString   标签里内容--字符串
# print(bs.title)
# print(bs.title.string)
# print(type(bs.title.string))

#3 -BeautifulSoup   #表示整个文档
# print(bs)
# print(type(bs))

#4 -Comment   #注释，是一个特殊的NavigableString，输出的内容不包含注释符号<!---->
# print(bs.a.string)
# print(type(bs.a.string))


#使用
# 1.文档遍历tag.contents,以列表的形式返回每个tag的内容
# print(bs.title.contents)
# print(bs.head.contents)
# print(bs.div.contents)
# print("\n")
# print(bs.body.contents)
# print("\n")
# print(bs.contents)
 #children:获取Tag的所有子节点，返回一个生成器
# for child in bs.body.children:
#     print(child)

# 2.文档搜索
#find_all()
# find_all( name , attrs , recursive , string , **kwargs )

# 1 name 参数可以查找所有名字为 name 的tag,字符串对象会被自动忽略掉.
# 3 调用tag的 find_all() 方法时,Beautiful Soup会检索当前tag的所有子孙节点,如果只想搜索tag的直接子节点,可以使用参数 recursive=False .
#字符串过滤，会查找与字符串完全匹配的内容的tag
# t_list = bs.find_all('a')

#正则表达式搜索，使用search()方法来匹配内容
# t_list = bs.find_all(re.compile('a'))   #查找到所有含有a的内容

#方法，传入一个函数，根据函数的要求来搜索
# def name_is_exists(tag):
#     return tag.has_attr('name')     #返回包含name属性的tag内容
# t_list = bs.find_all(name_is_exists)
# for item in t_list:
#     print(item)

# print(t_list)


# kwargs 参数
# t_list = bs.find_all(id='head')
# t_list = bs.find_all(class_=True)
# for item in t_list:
#     print(item)
# print(t_list)

# text内容
# t_list = bs.find_all(text='hao123')
# t_list = bs.find_all(text=["hao123","地图","贴吧"])


# t_list = bs.find_all(text=re.compile('\d'))   #使用正则表达式来查找包含特定文本的内容-标签里的字符串
#
# for item in t_list:
#     print(item)
# print(t_list)

# limit参数
# t_list = bs.find_all('a',limit=3)   #前三个tag为’a'的内容
#
# for item in t_list:
#     print(item)
# print(t_list)

# CSS选择器
# t_list = bs.select('title')   #通过tag来查找


# t_list = bs.select('.mnav')     #通过class来查找

# t_list = bs.select('#u1')       #通过id来查找

# t_list = bs.select('a[class="bri"]')       #通过属性来查找

# t_list = bs.select('head>title')       #通过子标签来查找
# for item in t_list:
#     print(item)
# print(t_list)

t_list = bs.select('.mnav ~.bri')       #通过兄弟标签来查找
print(t_list[0].get_text())   #第一个元素的文本内容




